const fs = require('fs');
const path = require('path');
const wav = require('node-wav');

/**
 * 生成指定频率的正弦波音频并保存为WAV文件
 * @param {number} frequency - 音频频率（Hz）
 * @returns {Promise<string>} - 生成的文件名
 */
async function generateAudio(frequency) {
    // 设置音频参数
    const sampleRate = 44100; // 采样率（Hz）
    const channels = 1; // 声道数（单声道）
    const amplitude = 1; // 振幅（0-1之间）
    const duration = 5; // 音频时长（秒）
    
    // 计算音频数据点数量
    const numSamples = sampleRate * duration;
    
    // 创建16位PCM缓冲区（2字节/样本）
    const audioData = Buffer.alloc(numSamples * 2);

    // 生成正弦波数据
    for (let i = 0; i < numSamples; i++) {
        const t = i / sampleRate; // 当前时间
        const sample = Math.sin(2 * Math.PI * frequency * t); // 正弦波值（范围：-1~1）
        const scaledSample = sample * amplitude; // 应用振幅
        const intSample = Math.floor(scaledSample * 32767); // 转换为16位整数
        
        // 写入16位整数到缓冲区（小端序）
        audioData.writeInt16LE(intSample, i * 2);
    }
    
    // 创建文件名（包含频率、采样率和生成时间）
    const now = new Date();
    // 格式化时间为：YYYY-MM-DD_HH-mm-ss
    const formattedTime = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}_${String(now.getHours()).padStart(2, '0')}-${String(now.getMinutes()).padStart(2, '0')}-${String(now.getSeconds()).padStart(2, '0')}`;
    const fileName = `audio_${frequency}hz_${sampleRate}sr_${formattedTime}.wav`;
    const filePath = path.join(__dirname, 'audio', fileName);
    
    // 手动构建WAV文件头（解决时长翻倍问题）
    const headerSize = 44;
    const dataSize = audioData.length;
    const fileSize = headerSize + dataSize;
    const header = Buffer.alloc(headerSize);

    // RIFF Chunk
    header.write('RIFF', 0);
    header.writeUInt32LE(fileSize - 8, 4); // 文件大小 - 8
    header.write('WAVE', 8);

    // fmt Subchunk
    header.write('fmt ', 12);
    header.writeUInt32LE(16, 16); // 子块大小（PCM为16）
    header.writeUInt16LE(1, 20); // 音频格式（1=PCM）
    header.writeUInt16LE(channels, 22); // 声道数
    header.writeUInt32LE(sampleRate, 24); // 采样率
    header.writeUInt32LE(sampleRate * channels * 2, 28); // 字节率 = 采样率*声道数*位深/8
    header.writeUInt16LE(channels * 2, 32); // 块对齐 = 声道数*位深/8
    header.writeUInt16LE(16, 34); // 位深度

    // data Subchunk
    header.write('data', 36);
    header.writeUInt32LE(dataSize, 40); // 数据大小

    // 合并头部和音频数据
    const wavData = Buffer.concat([header, audioData]);
    fs.writeFileSync(filePath, wavData);
    
    // 生成采样数据日志
    const logDir = path.join(__dirname, 'logs');
    if (!fs.existsSync(logDir)) {
        fs.mkdirSync(logDir, { recursive: true });
    }
    
    console.log(`音频文件已生成: ${filePath}`);
    return fileName;
}

module.exports = { generateAudio };